/*
 * @Author: hnq
 * @Date: 2021-03-22 10:32:21
 * @LastEditTime: 2022-12-29 15:07:58
 * @LastEditors: chengsl
 * @Description: 公共校验方法
 */

/* 是否手机号码*/
export function validatePhone(rule, value, callback) {
  const reg = /^(1[3-9]\d{9})$|^([5|6|8|9]\d{7})$|^([6]\d{5})$|^(09\d{8})$/
  if (value === '' || value === undefined || value == null) {
    callback()
  } else {
    if ((!reg.test(value)) && value !== '') {
      callback(new Error('请输入正确的手机号码'))
    } else {
      callback()
    }
  }
}

/* 是否身份证号码*/
export function validateIdNo(rule, value, callback) {
  const reg = /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/
  // /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/ // 出生日期校验不准确 栗子：513722199013410034
  if (value === '' || value === undefined || value == null) {
    callback()
  } else {
    if ((!reg.test(value)) && value !== '') {
      callback(new Error('请输入正确的身份证号码'))
    } else {
      // 身份证校验码算法
      let sum = 0
      for (let i = 17; i > 0; i--) {
        sum += (Math.pow(2, i) % 11) * parseInt(value.charAt(17 - i), 11)
      }
      const idCardLastList = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
      const remainder = sum % 11
      if (idCardLastList[remainder] !== value.substr(17, 1).toUpperCase()) {
        callback(new Error('请输入正确的身份证号码'))
      } else {
        callback()
      }
      // callback()
    }
  }
}

/**
 * 邮箱格式验证
 * @param {string} email
 * @returns {Boolean}
 */
export function validEmail(rule, value, callback) {
  if (!value) {
    callback()
    return
  }
  const reg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
  if (value.length > 50) {
    callback(new Error(`邮箱长度不能超过50`))
  }
  if (!reg.test(value)) {
    callback(new Error(`邮箱格式有误`))
  } else {
    callback()
  }
}
/**
 * 输入验证
 * @param {boolean} rule 是否校验格式
 * @param {*} value
 * @param {*} callback
 * @param {string} type 验证字段
 * @param {number} length 字符长度
 */
export function validateNormal(rule = true, value, callback, type, length = 50) {
  const reg = /^[\u4E00-\u9FA5A-Za-z0-9]+$/g
  if (value === '' || value === undefined || value === null) {
    callback()
  } else {
    if (value.length > length) {
      callback(new Error(`${type}长度超出限制,限制长度${length}`))
    }
    if (rule) {
      if ((!reg.test(value)) && value !== '') {
        callback(new Error(`${type}格式输入错误`))
      } else {
        callback()
      }
    } else {
      callback()
    }
  }
}

/**
 * 输入验证
 * @param {boolean} rule 必须由中文
 * @param {*} value
 * @param {*} callback
 * @param {string} type 验证字段
 * @param {number} length 字符长度
 */
export function validateChineseCharacter(rule = true, value, callback, type, length = 50) {
  const reg = /^[\u4e00-\u9fa5]+$/
  if (value === '' || value === undefined || value === null) {
    callback()
  } else {
    if (value.length > length) {
      callback(new Error(`${type}长度超出限制,限制长度${length}`))
    }
    if (rule) {
      if ((!reg.test(value)) && value !== '') {
        callback(new Error(`${type}格式输入错误`))
      } else {
        callback()
      }
    } else {
      callback()
    }
  }
}

/**
 * 输入验证
 * @param {boolean} rule 必须由中英文,数字,特殊符号 - ()
 * @param {*} value
 * @param {*} callback
 * @param {string} type 验证字段
 * @param {number} length 字符长度
 */
export function validateNormalCharacter(rule = true, value, callback, type, length = 50) {
  const reg = /^[A-Za-z0-9\u4E00-\u9FA5\(\)\uff08\uff09-]+$/
  if (value === '' || value === undefined || value === null) {
    callback()
  } else {
    if (value.length > length) {
      callback(new Error(`${type}长度超出限制,限制长度${length}`))
    }
    if (rule) {
      if ((!reg.test(value)) && value !== '') {
        console.log('又进来了')
        callback(new Error(`${type}格式输入错误`))
      } else {
        callback()
      }
    } else {
      callback()
    }
  }
}

/**
 * @description: 修改密码页面 - 新密码校验规则
 * @param {*} value
 * @param {*} callback
 *
  大小写字母、特殊字符、数字，任意三者组合其一
  大写+特殊+数字
  小写+特殊+数字
  大写+小写+数字
  大写+小写+特殊
 */
export function validPassword(value, callback) {
  const reg = /^(?![A-Za-z]+$)(?![A-Z\d]+$)(?![A-Z\W]+$)(?![a-z\d]+$)(?![a-z\W]+$)(?![\d\W]+$)\S{8,50}$/
  const regChinese = /[\u4e00-\u9fa5 ]/
  if (!value) {
    callback()
  } else if (value.length < 8 || value.length > 16) {
    callback(new Error(`请设置8~16字符的密码`))
  // } else if (value.includes(' ')) {
  //   callback(new Error(`不能包含空格`))
  } else if (regChinese.test(value)) {
    callback(new Error(`不能包含中文和空格`))
  } else if (!reg.test(value)) {
    callback(new Error(`密码应包含大写字母、小写字母、特殊字符、数字至少三种`))
  } else {
    callback()
  }
}

/**
 * 座机和传真校验
 * @param {string} value
 * @returns {Boolean}
 */
export function validTelOrFax(rule, value, callback) {
  if (!value) {
    callback()
  } else {
    const reg = /^(\d{3,4}-)?\d{7,8}$/
    if (value.length < 10 || value.length > 13 || !reg.test(value)) { // 判断传真字符范围是在10到13
      callback(new Error('座机或传真格式如:0376-1234567'))
    } else {
      callback()
    }
  }
}

/**
 * 网址校验
 * @param {string} value
 * @returns {Boolean}
 */

export function validURL(rule, value, callback) {
  if (!value) {
    callback()
  } else {
    // const reg = /^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:/?#[\]@!\$&'\*\+,;=.]+$/
    const reg = /^([hH][tT]{2}[pP]:\/\/|[hH][tT]{2}[pP][sS]:\/\/)(([A-Za-z0-9-~]+)\.)+([A-Za-z0-9-~\/])+$/
    if (!value.includes('http') && !value.includes('HTTP')) {
      callback(new Error('网址应包含http或https'))
    } else if (!reg.test(value) && value !== '') {
      callback(new Error('请输入正确的网址'))
    } else {
      callback()
    }
  }
}

/**
 * 网址校验
 * @param {string} value
 * @returns {Boolean}
 */

export function validAppUrlAddress(rule, value, callback) {
  if (!value) {
    callback()
  } else {
    // const reg = /^([hH][tT]{2}[pP]:\/\/|[hH][tT]{2}[pP][sS]:\/\/)(([A-Za-z0-9-~]+)\.)+([A-Za-z0-9-~\/])+$/
    if (!value.includes('http') && !value.includes('HTTP')) {
      callback(new Error('网址应包含http或https'))
    } else if (!value.includes('//')) {
      callback(new Error('请输入正确的网址'))
    } else {
      callback()
    }
  }
}

/**
 * 是否合法IP地址
 * @param rule
 * @param value
 * @param callback
 */
export function validateIp(rule, value, callback) {
  if (value === '' || value === undefined || value == null) {
    callback()
  } else {
    const reg = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/
    if ((!reg.test(value)) && value !== '') {
      callback(new Error('请输入正确的IP地址'))
    } else {
      callback()
    }
  }
}

/**
 * 是否合法邮编
 * @param rule
 * @param value
 * @param callback
 */
export function validatePostCode(rule, value, callback) {
  if (!value) {
    callback()
  } else {
    const reg = /^[0-9]{6}$/
    if (value.length !== 6) {
      callback(new Error('请输入6位数邮政编码'))
    } else if ((!reg.test(value)) && value !== '') {
      callback(new Error('请输入正确的邮政编码'))
    } else {
      callback()
    }
  }
}

/**
 * 输入验证 自定义正则校验
 * @param {*} value
 * @param {*} callback
 * @param {*} type
 * @param {*} length 最大长度
 * @param {*} reg 正则表达式
 * @param {*} errMessage 错误消息
 * @param {*} minLength 最小长度
 */
export function validChartByReg(value, callback, type, length = 50, reg, errMessage, minLength) {
  // const reg = /^[A-Za-z0-9\-\_]+$/
  if (!value) {
    callback()
  } else if (minLength && (value.length > length || value.length < minLength)) {
    callback(new Error(`${type}长度范围为${minLength}-${length}字符`))
  } else if (value.length > length) {
    callback(new Error(`${type}长度超出限制，限制长度${length}`))
  } else if (reg && !reg.test(value)) {
    callback(new Error(errMessage || `${type}格式输入错误`))
  } else {
    callback()
  }
}
